"""
自定义参数类型（自定义转换器）

 - 背景：
   - 如果系统提供的 int，float 等参数类型满足不了需求的时候，我们需要自定义
   - 之所以 int，float，path 可以接收不同的数据类型，是因为，系统已经提供好对应的转换器了
 - 自定义转换器格式
   - 1. 定义类，继承自 BaseConverter
   - 2. 重写 init 方法
   - 3. 初始化父类成员变量，还有子类自己的规则
   - 4. 将转换器类添加到系统默认的转换器列表中

   需求：接收三位整数
"""


import typing as t
from flask import Flask
from werkzeug.routing import BaseConverter
from werkzeug.routing.map import Map

app = Flask(__name__)


# - 1. 定义类，继承自 BaseConverter
class MyRegexConverter(BaseConverter):
    # 接收三位整数
    # regex = "\d{3}"  # 直接指定规则不灵活，具体匹配什么规则应该交给路由

    #  - 2. 重写 init 方法
    # 接收两个参数：map 和 regex
    def __init__(self, map, regex) -> None:
        # - 3. 初始化父类成员变量，还有子类自己的规则
        super(MyRegexConverter, self).__init__(map)
        self.regex = regex


# - 4. 将转换器类添加到系统默认的转换器列表中
app.url_map.converters["threeDigit"] = MyRegexConverter


# 匹配三位整数
@app.route("/<threeDigit('\d{3}'):number>")
def get_threeNumber(number):
    return f"the threeNumber is {number}"


# 匹配四位整数
@app.route("/<threeDigit('\d{4}'):number>")
def get_fourNumber(number):
    return f"the fourNumber is {number}"


# 匹配一个手机号
@app.route("/<threeDigit('^1[3-9]\d{9}'):number>")
def get_phoneNumber(number):
    return f"the phoneNumber is {number}"


if __name__ == "__main__":
    # app.run() 参数
    # 参数1：host，默认 127.0.0.1
    # 参数2：post，默认 5000
    # 参数3：debug，默认 False
    app.run(debug=True)
